"""
生成测试数据脚本
"""
import asyncio
from tortoise import Tortoise
from tool.sessing import TORTOISE_ORM
from models.m import User, Novel, Chapter, NovelCategory, Admin, AuthorVerification, UserRole, AdminRole, AuditStatus, NovelStatus, ChapterContentType, Gender, UserStatus
import datetime


# 生成随机文本内容的函数
def generate_chapter_content(title: str, word_count: int = 3000):
    """生成固定字数的章节内容"""
    base_text = f"""
{title}

第一章

夜色如墨，星空中闪烁着微弱的光芒。风从远方吹来，带着一丝凉意。

在一片荒芜的山谷中，有一个年轻人正盘腿而坐。他的身体周围环绕着淡淡的光芒，仿佛有什么神秘的力量正在觉醒。

这个年轻人名叫林风，原本只是一个普通的现代人。然而，命运的齿轮却在一个普通的夜晚开始转动。

"穿越吗？"林风睁开眼睛，看着周围陌生的环境，眼中闪过一丝迷茫。

他记得自己昨晚还在家中看小说，怎么醒来就到了这个奇怪的地方？

眼前的景象让他震撼不已：巍峨的山峰直插云霄，古老的树木高耸入云，空气中弥漫着一种从未感受过的能量波动。

"这是哪里？"林风站起身来，打量着四周。

忽然，一道金光从天而降，直接没入他的眉心。剧烈的疼痛让他几乎晕厥过去。

当疼痛退去，他发现脑海中多了一些东西。

"修炼功法？"林风愣了一下，"九转乾坤诀？"

一篇完整的修炼功法出现在他的脑海中，仿佛天生就知道如何使用。

"我真的穿越了？"林风心中既兴奋又有些不安。

他按照脑海中的功法开始修炼，周围的天地灵气缓缓汇聚而来。

时间一点点过去，林风感受到体内有一股热流在流动，这是从未有过的感觉。

"这就是灵力吗？"林风心中激动不已。

他一直幻想着能够修炼，没想到真的有一天能够接触到这种超凡的力量。

随着修炼的深入，林风感觉到身体变得更加强壮，五感变得更加敏锐。

他甚至能够听到风吹过树叶的声音，看到几十米外一只小虫爬过的痕迹。

"看来这个世界真的不简单。"林风深吸一口气，站起身来。

他知道自己需要更多的信息来了解这个世界。于是他朝着山谷外走去。

路上，他遇到了一些人。通过观察和偷听，他了解到这个世界是一个修炼的世界。

每个人都可以修炼，只要天赋足够，就能够成为强大的修炼者。

"有意思。"林风眼中闪过一丝战意。

作为一个现代人，他知道这是一个巨大的机遇。既然穿越了，那就不能浪费这个机会。

他要在这个世界闯出一片天地！

太阳渐渐西沉，林风找到了一处洞穴作为临时的住处。

他盘腿而坐，继续修炼。一夜无话。

第二天清晨，林风从修炼中醒来，感受到体内的灵力又增多了不少。

"看来修炼真的有用。"林风感叹道。

他离开洞穴，继续探索这个陌生的世界。

在一个小镇上，他听到了一些消息。

"听说最近有个遗迹要开启了。"一个路人说道。

"真的吗？那到时候肯定会有不少机缘。"另一个路人兴奋地说。

"遗迹吗？"林风心中一动。

或许这是他的机会。

他决定前往那个遗迹。在去的路上，他还顺手除掉了几个不怀好意的人。

这个世界很危险，但也有机遇。

林风一步步变强，也一步步接近了这个世界的真相。

"""
    
    # 如果字数不够，重复内容直到达到指定字数
    while len(base_text) < word_count:
        base_text += base_text
    
    # 截取到指定字数
    return base_text[:word_count]


async def generate_test_data():
    """生成测试数据"""
    print("开始初始化数据库连接...")
    await Tortoise.init(config=TORTOISE_ORM)
    
    # 创建数据库表
    await Tortoise.generate_schemas()
    print("[OK] 数据库连接成功")
    
    try:
        # 1. 升级现有用户为管理员
        print("\n【步骤1】设置现有用户为管理员...")
        existing_user = await User.get_or_none(id=1)
        if existing_user:
            existing_user.role = UserRole.ADMIN
            await existing_user.save()
            
            # 检查管理员表是否已存在该用户
            admin = await Admin.get_or_none(user_id=1)
            if not admin:
                admin = await Admin.create(
                    user=existing_user,
                    username="admin",
                    email="admin@nove.com",
                    admin_role=AdminRole.SUPER_ADMIN,
                    permissions={},
                    is_active=True
                )
                print(f"[OK] 已将用户 {existing_user.nickname} 设置为超级管理员")
        else:
            print("[WARN] 未找到ID为1的用户，跳过此步骤")
        
        # 2. 创建分类
        print("\n【步骤2】创建小说分类...")
        
        # 穿越修仙分类
        result = await NovelCategory.get_or_create(
            name="穿越修仙",
            defaults={
                'slug': 'xianxia-transmigration',
                'description': '穿越到修仙世界的小说',
                'level': 1,
                'sort_order': 1
            }
        )
        xianxia_cat = result[0]
        print(f"[OK] 分类：穿越修仙")
        
        # 诡异分类
        result2 = await NovelCategory.get_or_create(
            name="诡异",
            defaults={
                'slug': 'mystery',
                'description': '悬疑诡异类小说',
                'level': 1,
                'sort_order': 2
            }
        )
        mystery_cat = result2[0]
        print(f"[OK] 分类：诡异")
        
        # 3. 创建作者张三
        print("\n【步骤3】创建作者...")
        
        zhang_san = await User.get_or_none(phone="13800138000")
        if not zhang_san:
            zhang_san = await User.create(
                phone="13800138000",
                nickname="张三",
                role=UserRole.AUTHOR,
                status=UserStatus.ACTIVE,
                bio="资深小说作家，擅长写穿越修仙和悬疑小说",
                avatar_url="https://via.placeholder.com/200",
                gender=Gender.MALE
            )
            print(f"[OK] 创建作者：张三（ID: {zhang_san.id}）")
        else:
            print(f"[INFO] 作者张三已存在（ID: {zhang_san.id}）")
        
        # 为张三创建作者认证
        verification = await AuthorVerification.get_or_none(user=zhang_san)
        if not verification:
            await AuthorVerification.create(
                user=zhang_san,
                real_name="张三",
                id_card="110101199001011234",
                pen_name="张三",
                introduction="资深网络小说作家，著有《修仙传奇》等多部作品",
                status=1  # APPROVED
            )
            print(f"[OK] 作者认证已通过")
        else:
            print(f"[INFO] 作者认证已存在")
        
        # 4. 创建5个普通用户
        print("\n【步骤4】创建普通用户...")
        users = []
        names = ["李四", "王五", "赵六", "钱七", "孙八"]
        
        for i, name in enumerate(names, start=1):
            user = await User.get_or_none(phone=f"1380013800{i}")
            if not user:
                user = await User.create(
                    phone=f"1380013800{i}",
                    nickname=name,
                    role=UserRole.USER,
                    status=UserStatus.ACTIVE,
                    bio=f"普通读者，喜欢看书",
                    avatar_url=f"https://via.placeholder.com/200?text={name}",
                    gender=Gender.UNKNOWN if i % 2 == 0 else Gender.MALE
                )
                print(f"[OK] 创建用户：{name}（ID: {user.id}）")
            else:
                print(f"[INFO] 用户{name}已存在（ID: {user.id}）")
            users.append(user)
        
        # 5. 创建小说
        print("\n【步骤5】创建小说...")
        
        # 穿越修仙类小说（5本）
        xianxia_novels = [
            {
                "title": "穿越修仙界：逆天崛起",
                "description": "一个现代程序员穿越到修仙世界，凭借现代知识和系统帮助，在修仙界掀起波澜。",
                "tags": ["穿越", "修仙", "系统", "爽文"]
            },
            {
                "title": "从零开始的修仙之路",
                "description": "平凡的现代青年意外穿越到修仙世界，从零开始踏上修仙之路，一步步成长为绝世强者。",
                "tags": ["穿越", "修仙", "废材流", "励志"]
            },
            {
                "title": "重返修仙界",
                "description": "前世的修仙天才重生于少年时代，拥有前世记忆和修炼经验，誓要弥补遗憾，重登巅峰。",
                "tags": ["重生", "修仙", "天才", "逆袭"]
            },
            {
                "title": "现代科技vs修仙法术",
                "description": "科技天才穿越到修仙世界，用现代科技改造传统修仙体系，创造出一条前所未有的修炼之路。",
                "tags": ["穿越", "修仙", "科技", "创新"]
            },
            {
                "title": "九转修仙录",
                "description": "普通大学生穿越到修仙世界，获得神秘的九转修仙诀，历经九次转生，最终成就无上仙位。",
                "tags": ["穿越", "修仙", "转生", "玄幻"]
            }
        ]
        
        # 诡异类小说（5本）
        mystery_novels = [
            {
                "title": "诡异公寓：午夜惊魂",
                "description": "一个年轻人搬进了一栋老旧的公寓楼，却发现这里隐藏着恐怖的秘密。每个午夜，都会发生诡异的事情。",
                "tags": ["恐怖", "悬疑", "诡异", "惊悚"]
            },
            {
                "title": "镜中世界",
                "description": "一面古老的镜子能够通往另一个世界，那个世界里充满了诡异和危险。主角在探索过程中发现了令人震惊的真相。",
                "tags": ["诡异", "悬疑", "惊悚", "异世界"]
            },
            {
                "title": "血色医院",
                "description": "一家废弃的医院，传闻每到午夜就会有诡异的事情发生。主角因为好奇心进入其中，却发现了令人毛骨悚然的秘密。",
                "tags": ["恐怖", "医院", "诡异", "悬疑"]
            },
            {
                "title": "诅咒之书",
                "description": "一本古老的书籍，记载着无数诅咒。凡是阅读过这本书的人，都会遭遇诡异的事件。主角意外得到这本书，陷入了危机之中。",
                "tags": ["诅咒", "诡异", "悬疑", "惊悚"]
            },
            {
                "title": "午夜十二点的钟声",
                "description": "每到午夜十二点，古老的钟楼就会响起诡异的钟声。听到钟声的人会进入一个诡异的世界，能否活着回来都是未知数。",
                "tags": ["诡异", "钟声", "悬疑", "恐怖"]
            }
        ]
        
        # 创建穿越修仙类小说
        created_novels = []
        for i, novel_data in enumerate(xianxia_novels, start=1):
            novel = await Novel.get_or_none(title=novel_data['title'])
            if not novel:
                novel = await Novel.create(
                    user=zhang_san,
                    title=novel_data['title'],
                    author="张三",
                    description=novel_data['description'],
                    category=xianxia_cat,
                    tags=novel_data['tags'],
                    status=NovelStatus.SERIALIZING,
                    audit_status=AuditStatus.APPROVED,
                    audited_at=datetime.datetime.now(),
                    word_count=3000,
                    chapter_count=1,
                    is_vip=False,
                    is_featured=(i <= 2)  # 前2本设为推荐
                )
                print(f"[OK] 创建穿越修仙小说 {i}/5：{novel_data['title']}")
            else:
                print(f"[INFO] 小说《{novel_data['title']}》已存在")
            created_novels.append(novel)
        
        # 创建诡异类小说
        for i, novel_data in enumerate(mystery_novels, start=1):
            novel = await Novel.get_or_none(title=novel_data['title'])
            if not novel:
                novel = await Novel.create(
                    user=zhang_san,
                    title=novel_data['title'],
                    author="张三",
                    description=novel_data['description'],
                    category=mystery_cat,
                    tags=novel_data['tags'],
                    status=NovelStatus.SERIALIZING,
                    audit_status=AuditStatus.APPROVED,
                    audited_at=datetime.datetime.now(),
                    word_count=3000,
                    chapter_count=1,
                    is_vip=False,
                    is_featured=(i <= 2)  # 前2本设为推荐
                )
                print(f"[OK] 创建诡异小说 {i}/5：{novel_data['title']}")
            else:
                print(f"[INFO] 小说《{novel_data['title']}》已存在")
            created_novels.append(novel)
        
        # 6. 为每本小说创建章节
        print("\n【步骤6】为小说创建章节...")
        for novel in created_novels:
            # 检查章节是否已存在
            chapter = await Chapter.get_or_none(novel=novel, chapter_number=1)
            if not chapter:
                # 创建第一章
                chapter_content = generate_chapter_content(
                    novel.title,
                    word_count=3000
                )
                
                # 创建章节，包含实际内容
                chapter = await Chapter.create(
                    novel=novel,
                    title=f"{novel.title} - 第一章",
                    chapter_number=1,
                    content=chapter_content,  # 存储实际内容
                    content_type=ChapterContentType.TEXT,
                    word_count=len(chapter_content),
                    audit_status=AuditStatus.APPROVED,
                    is_vip=False,
                    view_count=100 + created_novels.index(novel) * 10  # 设置不同的浏览量
                )
                
                print(f"[OK] 为《{novel.title}》创建第1章（{len(chapter_content)}字）")
            else:
                print(f"[INFO] 《{novel.title}》第1章已存在")
        
        print("\n" + "="*50)
        print("[OK] 数据生成完成！")
        print("="*50)
        
        # 显示统计信息
        total_users = await User.all().count()
        total_novels = await Novel.all().count()
        total_chapters = await Chapter.all().count()
        total_admins = await Admin.all().count()
        
        print(f"\n[STAT] 数据统计：")
        print(f"   - 用户总数: {total_users}")
        print(f"   - 管理员数: {total_admins}")
        print(f"   - 小说总数: {total_novels}")
        print(f"   - 章节总数: {total_chapters}")
        
    except Exception as e:
        print(f"[ERROR] 生成数据时出错: {str(e)}")
        import traceback
        traceback.print_exc()
    
    finally:
        await Tortoise.close_connections()


if __name__ == "__main__":
    asyncio.run(generate_test_data())

